/**
 * @file Point3D.h
 * @brief 三维点结构体的定义
 * 
 * 提供了高性能的三维点表示，特性包括：
 * 1. 32字节内存对齐，优化SIMD操作
 * 2. AVX指令集优化的距离计算
 * 3. 使用联合体实现SIMD数据访问
 * 4. 支持基本的点操作和比较
 */
#pragma once
#include <cstddef>
#include <immintrin.h>  // SIMD支持
#include <array>

struct alignas(32) Point3D {
    /**
     * @brief 使用联合体同时支持普通坐标访问和SIMD操作
     */
    union {
        struct { 
            double x;  ///< X坐标分量
            double y;  ///< Y坐标分量
            double z;  ///< Z坐标分量
        };
        __m256d simd_data;  ///< AVX寄存器数据，用于SIMD计算
    };
    char padding[24];  ///< 32字节对齐的填充数据

    /**
     * @brief 默认构造函数
     * 
     * 初始化所有坐标为0
     */
    Point3D() : x(0), y(0), z(0) {}

    /**
     * @brief 带参数的构造函数
     * @param x_ X坐标值
     * @param y_ Y坐标值
     * @param z_ Z坐标值
     */
    Point3D(double x_, double y_, double z_) : x(x_), y(y_), z(z_) {}

    /**
     * @brief 计算到另一个点的距离平方
     * @param other 另一个点的坐标
     * @return 返回两点间距离的平方
     */
    inline double distanceSquaredTo(const Point3D &other) const {
        __m256d v1 = _mm256_set_pd(0, z, y, x);
        __m256d v2 = _mm256_set_pd(0, other.z, other.y, other.x);
        __m256d diff = _mm256_sub_pd(v1, v2);
        __m256d square = _mm256_mul_pd(diff, diff);
        __m256d sum = _mm256_hadd_pd(square, square);
        return ((double*)&sum)[0] + ((double*)&sum)[2];
    }

    /**
     * @brief 相等比较运算符
     * @param other 要比较的点
     * @return 如果两点坐标完全相等则返回true
     */
    bool operator==(const Point3D &other) const {
        return x == other.x && y == other.y && z == other.z;
    }
}; 